/*-------------------------------------------------------------------------
 *
 * lockoptions.h
 *	  某些与锁相关声明的公共头文件。
 *
 *
 * Copyright (c) 2014-2022, PostgreSQL Global Development Group
 *
 * src/include/nodes/lockoptions.h
 *
 *-------------------------------------------------------------------------
 */
#ifndef LOCKOPTIONS_H
#define LOCKOPTIONS_H

/*
 * 此枚举表示 FOR UPDATE/SHARE 子句的不同强度。
 * 这里的顺序很重要，因为当以多种方式指定 RTE 时，最高的数值优先。
 * 参见 applyLockingClause。
 */
typedef enum LockClauseStrength
{
	LCS_NONE,					/* 没有这样的子句 - 仅在 PlanRowMark 中使用 */
	LCS_FORKEYSHARE,			/* FOR KEY SHARE */
	LCS_FORSHARE,				/* FOR SHARE */
	LCS_FORNOKEYUPDATE,			/* FOR NO KEY UPDATE */
	LCS_FORUPDATE				/* FOR UPDATE */
} LockClauseStrength;

/*
 * 此枚举控制如何处理被 FOR UPDATE/SHARE 子句锁定的行
 * （即，它表示 NOWAIT 和 SKIP LOCKED 选项）。
 * 这里的顺序很重要，因为当以多种方式指定 RTE 时，最高的数值优先。
 * 参见 applyLockingClause。
 */
typedef enum LockWaitPolicy
{
	/* 等待锁变得可用（默认行为） */
	LockWaitBlock,
	/* 跳过无法锁定的行（SKIP LOCKED） */
	LockWaitSkip,
	/* 如果行无法锁定则引发错误（NOWAIT） */
	LockWaitError
} LockWaitPolicy;

/*
 * 元组的可能锁模式。
 */
typedef enum LockTupleMode
{
	/* SELECT FOR KEY SHARE */
	LockTupleKeyShare,
	/* SELECT FOR SHARE */
	LockTupleShare,
	/* SELECT FOR NO KEY UPDATE，以及不修改键列的 UPDATE */
	LockTupleNoKeyExclusive,
	/* SELECT FOR UPDATE, UPDATEs that modify key columns, and DELETE */
	LockTupleExclusive
} LockTupleMode;

#endif							/* LOCKOPTIONS_H */
